perm filename EMAIN4.2[EAL,HE]2 blob sn#704721 filedate 1983-03-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Editor: Statement executor for immediate mode }
C00006 00003	procedure eDoStmnt external
C00009 ENDMK
C⊗;
{$NOMAIN	Editor: Statement executor for immediate mode }

%include emain.hdr;

{ Externally defined routines from elsewhere: }

	(* From ALLOC *)
function newStatement: statementp;				external;
procedure relStatement(n: statementp);				external;

	(* From CALLER *)
procedure emAddStmnt(firstTime: boolean; which: integer);	external;

	(* From ETOKEN *)
procedure getToken;						external;

	(* From EAUX1A *)
procedure pushStmnt(s: statementp; indent: integer);		external;

	(* From EAUX1C *)
procedure relExpr(n: nodep);					external;

	(* From EEXPAR *)
function exprParse: nodep;					external;

	(* From EPAR3A *)
procedure assignParse(st: statementp; np: nodep);		external;

	(* From EPAR3C *)
function declarationp: boolean;					external;

	(* From EPAR3D *)
function addNewDeclarations: integer;				external;

	(* From EAUX3B *)
procedure collectStmnt(s: statementp);				external;

	(* From EDEBUG *)
procedure executeStmnt(st: statementp; which: integer);		external;
procedure pevalExpr(n: nodep; which: integer);			external;

	(* From PP *)
function getLine(length: integer): linerecp;			external;
procedure relLine(l: linerecp);					external;
procedure ppLine; 						external;
procedure ppOutNow; 						external;
procedure ppChar(ch: ascii); 					external;
procedure pp5(ch: c5str; length: integer); 			external;
procedure pp10(ch: cstring; length: integer); 			external;
procedure pp10L(ch: cstring; length: integer);			external;
procedure pp20(ch: c20str; length: integer); 			external;
procedure pp20L(ch: c20str; length: integer); 			external;
procedure ppInt(i: integer); 					external;
procedure ppReal(r: real); 					external;
procedure ppStrng(length: integer; s: strngp); 			external;
procedure ppDtype(d: datatypes);				external;
procedure ppDelChar; 						external;

procedure em4Get; external;
procedure em4Get; begin end;

procedure eDoStmnt; external;
procedure eDoStmnt;
 var s,sp: statementp; b: boolean; n: nodep;
     i: integer;
 begin
 with curToken do
  begin
  backUp := true;
  n := exprParse;			(* see what we're to evaluate *)
  getToken;				(* & check if followed by an ":=" *)
  if (ttype = reswdtype) and (rtype = stmnttype) and
     (stmnt = assigntype) then		(* Is it an assignment? *)
    begin				(* Yes - need to parse it *)
    s := newStatement;
    s↑.stype := assigntype;
    sParse := true;
    fParse := true;
    backup := true;
    assignParse(s,n);
    sParse := false;
    fParse := false;
    i := addNewDeclarations;
    collectStmnt(s);		(* if collecting add stmnt to prog *)
    executeStmnt(s,4);		(* go do it *)
    end
   else pevalExpr(n,4);		(* eval & print out expr *)
  end
 end;


procedure eDoOtherCmd; external;
procedure eDoOtherCmd;
 var i: integer; s: statementp;
 begin
 with curToken do
  begin
  backUp := true;
  if declarationp then
    begin
    backUp := true;
    emAddStmnt(false,4);	(* Use overlay caller *)
    end
   else
    begin			(* have parser parse it *)
    i := cursor;
    sParse := true;
    fParse := true;
    backup := true;
    s := newStatement;
    s↑.stype := emptytype;
    curLine := 0;
    pushStmnt(s,0);		(* so addStmnt will work right *)
    sCursor := cursor;
    i := cursorLine;
    cursorLine := 1;
    newDeclarations := nil;
    emAddStmnt(false,4);
    cursor := sCursor - 1;	(* restore cursor *)
    cursorLine := i;
    sParse := false;
    fParse := false;
    i := addNewDeclarations;
    if s↑.stype = emptytype then relStatement(s)
     else
      begin
      collectStmnt(s);		(* if collecting add stmnt to prog *)
      executeStmnt(s,4);	(* go do it *)
      end;
    end
  end
 end;